/*This file is part of Sandbox.

Sandbox is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License.

Sandbox is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Sandbox.  If not, see <http://www.gnu.org/licenses/>.

For contact, see the About page of my blog: <http://mygeekyware.wordpress.com/>.*/

#include <iostream>
#include "controlador.h"
#include "definiciones.h"
#include <SDL/SDL.h>
#include <SDL/SDL_events.h>
#include "particula.h"
#include <math.h>

using namespace std;

void controlador::Fire(particula matriz[400][220], int x, int y) {
    //Make the vertical velocity to go to -1 if it's not
    if (matriz[x][y].vy >= 0)
        matriz[x][y].vy--;

    //Make the horizontal speed to go to 0 if it's not 0
    if (matriz[x][y].vx > 1)
        matriz[x][y].vx--;
    else if (matriz[x][y].vx < -1)
        matriz[x][y].vx++;

    //Change horizontal speed
    if (matriz[x][y].vx == 1) {
        if (contadorgeneral%2 == 0 + rand()%2) {
            matriz[x][y].vx = 1;
        }
        else
            matriz[x][y].vx = -1;
    }
    else if (matriz[x][y].vx == -1) {
        if (contadorgeneral%2 == 0 + rand()%2) {
            matriz[x][y].vx = -1;
        }
        else
            matriz[x][y].vx = 1;
    }
    else if (matriz[x][y].vx == 0) {
        if (contadorgeneral%2 == 0 + rand()%2) {
            matriz[x][y].vx = 1;
        }
        else
            matriz[x][y].vx = -1;
    }
    //Gather data from object
    int vx = matriz[x][y].vx;
    int vy = matriz[x][y].vy;
    if (contadorgeneral%2 != 0 + rand()%2)
        matriz[x][y].contador--;
    if (matriz[x][y].contador < 0) {
        Clear(matriz,x,y);
    }
    if (x+vx >= 0 && x+vx < 400 && y+vy >= 0 && y+vy < 220) {
        if (matriz[x+vx][y+vy].tipo == 0) {
            Copy(matriz, x, y, x+vx, y+vy);
            Clear(matriz,x,y);
            if (vx > 0 || vy > 0)
                matriz[x+vx][y+vy].update = false;
            //return ;
        }
        else if (vy == -1) {
            bool react;
            if (matriz[x][y-1].tipo > FIRE) {
                react = chkReaction(FIRE, matriz[x][y-1].tipo);
            }
            else {
                react = chkReaction(matriz[x][y-1].tipo, FIRE);
            }
            if (!react) {
                if (matriz[x-1][y-1].tipo > FIRE) {
                    react = chkReaction(FIRE, matriz[x-1][y-1].tipo);
                }
                else {
                    react = chkReaction(matriz[x-1][y-1].tipo, FIRE);
                }
            }
            if (!react) {
                if (matriz[x+1][y-1].tipo > FIRE) {
                    react = chkReaction(FIRE, matriz[x+1][y-1].tipo);
                }
                else {
                    react = chkReaction(matriz[x+1][y-1].tipo, FIRE);
                }
            }
            if (!react) {
                if (matriz[x][y-1].tipo == 0) {
                    Copy(matriz,x,y,x,y-1);
                    Clear(matriz,x,y);
                }
                else {
                    if (contadorgeneral%2 == 0 + rand()%2) {
                        if (matriz[x-1][y-1].tipo == 0) {
                            Copy(matriz,x,y,x-1,y-1);
                            Clear(matriz,x,y);
                        }
                        else if (matriz[x+1][y-1].tipo == 0) {
                            Copy(matriz,x,y,x+1,y-1);
                            Clear(matriz,x,y);
                            matriz[x+1][y-1].update = false;
                        }
                        else
                            Clear(matriz,x,y);
                    }
                    else {
                        if (matriz[x+1][y-1].tipo == 0) {
                            Copy(matriz,x,y,x+1,y-1);
                            matriz[x+1][y-1].update = false;
                            Clear(matriz,x,y);
                        }
                        else if (matriz[x-1][y-1].tipo == 0) {
                            Copy(matriz,x,y,x-1,y-1);
                            Clear(matriz,x,y);
                        }
                        else
                            Clear(matriz,x,y);
                    }
                }
            }
            else { //Reacciones
                
            }
            //Reacciones ajenas al hecho de adonde se mueve (you don't have to touch fire to get burned!)
            if (matriz[x][y-1].tipo == PLANT) {
                Plant2Fire(matriz,x,y-1);
            }
            if (matriz[x+1][y-1].tipo == PLANT) {
                Plant2Fire(matriz,x+1,y-1);
            }
            if (matriz[x-1][y-1].tipo == PLANT) {
                Plant2Fire(matriz,x-1,y-1);
            }
            if (matriz[x-1][y].tipo == PLANT) {
                Plant2Fire(matriz,x-1,y);
            }
            if (matriz[x+1][y].tipo == PLANT) {
                Plant2Fire(matriz,x+1,y);
            }
            if (matriz[x-1][y+1].tipo == PLANT) {
                Plant2Fire(matriz,x-1,y+1);
            }
            if (matriz[x][y+1].tipo == PLANT) {
                Plant2Fire(matriz,x,y+1);
            }
            if (matriz[x+1][y+1].tipo == PLANT) {
                Plant2Fire(matriz,x+1,y+1);
            }
        }
    }
    else
        Clear(matriz,x,y);

    matriz[x][y].temperatura = 25;
}